
#ifndef _TAB_DYNAMIQUE_LASER
#define _TAB_DYNAMIQUE_LASER

#include "spaceShip.h"

typedef laser ElemTDLaser;

typedef struct
{
  /*   donnees membres  */
  /*   (ne sont pas censees etre connues par l'utilisateur d'un module :  */
  /*   SI ON AVAIT PU NE PAS LES FAIRE FIGURER DANS L'INTERFACE,
       on l'aurait fait!) */
  unsigned int capacite;
  unsigned int taille_utilisee;
  ElemTDLaser * ad;
}TableauDynamiqueLaser;


void initialiserTabDynLaser(TableauDynamiqueLaser * t);
/* Precondition : t non prealablement initialise */
/* Postcondition : t initialise a une alveole vide (taille utilisee nulle) */


void testamentTabDynLaser(TableauDynamiqueLaser *t);
/* Precondition : t prealablement initialise */
/* Postcondition : t pret a disparaitre. La memoire allouee dynamiquement
   est liberee. On ne pourra plus appeler les sous-programmes qui
   necessitent que t soit initialise. */


void affecterTabDynLaser(TableauDynamiqueLaser *t1, const TableauDynamiqueLaser *t2);
/* Precondition : t1 et t2 initialises */
/* Postcondition : l'ancien contenu de t1 est perdu. t1 et t2 contiennent
   des sequences d'ElemTDLaser identiques (t1 correspond a une copie de t2,
   les 2 tableaux ont meme capacite, meme taille utilisee, mais sont
   independants) */

unsigned int tailleUtiliseeTabDynLaser(const TableauDynamiqueLaser *t);
/* Precondition : t prealablement initialise */
/* Resultat : nombre d'ElementTDs stockes dans t */


ElemTDLaser* valeurIemeElementTabDynLaser(const TableauDynamiqueLaser *t, unsigned int i);
/* Precondition : t prealablement initialise, 0 <= i < tailleUtilisee(t) */
/* Resultat : retourne l'adresse du i+1eme ElemTDLaser de t */


void ajouterElementTabDynLaser(TableauDynamiqueLaser *t, ElemTDLaser e);
/* Precondition : t prealablement initialise */
/* Postcondition : L'element e est ajoute dans la premiere alveole inutilisee
   du tableau, la taille utilisee est incrementee de 1. Doublement de la
   capacite de t, si necessaire. */


void supprimerElementTabDynLaser( TableauDynamiqueLaser *t, int position );
/* Precondition : t prealablement initialise et non vide */
/* Postcondition : la taille utilisee du tableau est decrementee de 1. Si
   tailleUtilisee < capacite/3, alors on divise la capacité par 2. */


void modifierValeurIemeElementTabDynLaser(TableauDynamiqueLaser *t, ElemTDLaser e, unsigned int i);
/* Precondition : t prealablement initialise et 0 <= i < tailleUtilisee(t) */
/* Postcondition : le ieme ElemTDLaser de t vaut e */


void insererElementTabDynLaser(TableauDynamiqueLaser *t, ElemTDLaser e, unsigned int i);
/* Precondition : t prealablement initialise et 0 <= i < tailleUtilisee(t) */
/* Postcondition : e est insere en i+1eme position et tailleUtilisee est incrementee de 1 */

void trierTabDynLaser(TableauDynamiqueLaser *t) ;
/* Precondition : t prealablement initialise */
/* Postcondition : t est trie dans l'ordre croissant */


int rechercherElementTabDynLaser(const TableauDynamiqueLaser *t, ElemTDLaser e);
/* Precondition : t prealablement initialise et trie dans l'ordre
   croissant */
/* Resultat : numero de l'alveole (ou l'une des alveoles) qui contient un
   ElemTDLaser egal a e, ou bien -1 si t ne contient pas d'element egal a e */


#endif
